package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import javax.swing.JPanel;
import logica.Boid;
import logica.Constanten;
import logica.Dier;
import logica.IGebied;
import logica.Obstakel;
import logica.Orka;
import logica.Zee;

/**
 * Deze klasse implementeert IView en is afgeleid van JPanel.
 * Deze klasse stelt ons paneel van de Zee (en al zijn objecten erin) voor.
 *
 * @author Bart Bruynooghe
 * @author Benjamin De Clercq
 * @author Thomas Flamant
 * @author Sander Van den Broecke
 */
public class JZee extends JPanel implements IView {

	private Zee myZee;

	/**
	 * Construeert een view voor de opgegeven zee.
	 * @param myZee De zee waarvoor een view moet gemaakt worden.
	 */
	public JZee(Zee myZee) {
		this.myZee = myZee;
		setBackground(Color.BLUE);
		setPreferredSize(new Dimension(Constanten.AANTALGEBIEDENBREEDTE * Constanten.ZIJDEGEBIED, Constanten.AANTALGEBIEDENHOOGTE * Constanten.ZIJDEGEBIED));
		repaint();
	}

	/**
	 * Zorgt voor een update van de view.
	 */
	public void updateView() {
		repaint();
	}

	/**
	 * Tekent alles op het scherm (overschrijft de methode paintComponent van JComponent).
	 * @see JComponent
	 */
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		IGebied[][] gebieden = myZee.getGebieden();
		g.setColor(Color.BLACK);
		for (int i = 0; i < Constanten.AANTALGEBIEDENHOOGTE; i++) {
			for (int j = 0; j < Constanten.AANTALGEBIEDENBREEDTE; j++) {
				if (gebieden[i][j] instanceof Obstakel) {

					if (i == 0 || j == 0 || i == Constanten.AANTALGEBIEDENHOOGTE - 1 || j == Constanten.AANTALGEBIEDENBREEDTE - 1) {
						g.fillRect(j * Constanten.ZIJDEGEBIED, i * Constanten.ZIJDEGEBIED, Constanten.ZIJDEGEBIED, Constanten.ZIJDEGEBIED);
					} else {
						g.fillOval(j * Constanten.ZIJDEGEBIED, i * Constanten.ZIJDEGEBIED, Constanten.ZIJDEGEBIED, Constanten.ZIJDEGEBIED);
					}
				}
			}
		}
		for (Dier dier : myZee.getDieren()) {
			teken((Graphics2D) g, dier);
		}

	}

	/**
	 * Tekent het meegegeven dier.
	 * @param g     De graphics waar op getekent moeten worden.
	 * @param dier  Het dier dat getekent moet worden.
	 */
	private void teken(Graphics2D g, Dier dier) {
		if (dier instanceof Boid) {
			tekenBoid(g, dier);
		} else if (dier instanceof Orka) {
			tekenOrka(g, dier);
		}
	}

	private void tekenBoid(Graphics2D g, Dier dier) {
		double x = dier.getPositie().x;
		double y = dier.getPositie().y;
		double bewhoek = (dier.getZwemslag() ? 0.15 : -0.15);
		dier.zwem();
		double hoek = dier.getRichting() + bewhoek;
		g.translate(x, y);
		g.rotate(hoek);
		g.setColor(Color.ORANGE);
		g.fillPolygon(BoidPolygon.getInstance());
		g.setColor(Color.red);
		g.drawPolygon(BoidPolygon.getInstance());
		g.rotate(-hoek);
		g.translate(-x, -y);


	}

	private void tekenOrka(Graphics2D g, Dier dier) {
		double x = dier.getPositie().x;
		double y = dier.getPositie().y;
		double bewhoek = (dier.getZwemslag() ? 0.02 : -0.02);
		dier.zwem();
		double hoek = dier.getRichting() + bewhoek;

		g.translate(x, y);
		g.rotate(hoek);
		g.setColor(Color.DARK_GRAY);
		g.fillPolygon(OrkaPolygon.getInstance());
		g.setColor(Color.DARK_GRAY);
		g.drawPolygon(OrkaPolygon.getInstance());
		g.rotate(-hoek);
		g.translate(-x, -y);
	}

	public void setZee(Zee myZee) {
		this.myZee = myZee;
	}
}
